import 'reflect-metadata'

class MyClass {
  myProperty: string
  // 给 name 属性添加一个 address 元数据 ( 元数据是保存到 MyClass.prototype 上的 ) 值是 'zf'
  @Reflect.metadata('address', 'zf')
  name = 'zs'

  constructor(value: string) {
    this.myProperty = value
  }

  // 给 myMethod 添加一个 data1 的元数据 ( 元数据是保存到 MyClass.prototype 上的 ) 其中值是 { a: 1, b: 2 }
  @Reflect.metadata('data1', { a: 1, b: 2 })
  // 给 myMethod 添加一个 data2 的元数据 其中值是 'c'
  @Reflect.metadata('data2', 'c')
  myMethod() {
    console.log('执行 myMethod')
  }
}

const instance = new MyClass('zs')

// 获取 instance 实例对象 name 元数据中的 address 的值
console.log(Reflect.getMetadata('address', instance, 'name')) // 'zf'

// 判断 instance 实例对象 name 里面的 address 元数据是否存在
console.log(Reflect.hasMetadata('address', instance, 'name')) // true

// 删除 instance 原型对象上 name 元数据里面的 address 属性
Reflect.deleteMetadata('address', Object.getPrototypeOf(instance), 'name')

// instance 自身及原型链上的 name 属性没有 address 元数据
console.log(Reflect.hasMetadata('address', instance, 'name')) // false
